import numpy as np  # 导入numpy库，并简写为np，用于高效的数值计算
import scipy.stats as sts  # 导入scipy库中的stats模块，并简写为sts，用于统计分析
import matplotlib as mpl  # 导入matplotlib库，并简写为mpl，这是一个用于数据可视化的库
import matplotlib.pyplot as plt  # 从matplotlib库中导入pyplot模块，并简写为plt，提供了类似于MATLAB的绘图系统

# 设置Matplotlib的默认参数
mpl.rcParams['axes.grid'] = 'True'  # 启用网格线
mpl.rcParams['grid.color'] = 'darkgrey'  # 设置网格线的颜色为深灰色
mpl.rcParams['lines.linewidth'] = 1  # 设置线条宽度为1
mpl.rcParams['axes.prop_cycle'] = mpl.cycler(color=["grey"])  # 设置循环使用的颜色为灰色，但在这个例子中它可能不会影响所有绘图

# 生成一个包含100个随机样本的数组，这些样本是从均值为50、标准差为15的正态分布中抽取的。
x1 = np.random.normal(50, 15, 100)  # 从均值为50、标准差为15的正态分布中抽取100个随机样本

# 最小-最大归一化处理
# 每个元素都除以 x1 的取值范围，从而将 x1 中的所有元素都转换到0到1之间。
z1 = (x1 - np.min(x1)) / (max(x1) - min(x1))

# 创建图形和子图
fig = plt.figure()  # 创建一个新的图形
plt.subplot(221)  # 激活一个2x2的子图网格中的第一个子图
plt.plot(x1)  # 绘制x1的折线图
plt.plot(z1)  # 在同一个子图中绘制z1的折线图，这可能会导致z1的线条覆盖x1的线条
plt.subplot(222)  # 激活第二个子图
plt.hist(x1)  # 绘制x1的直方图
plt.subplot(223)  # 激活第三个子图
plt.plot(z1)  # 绘制z1的折线图
plt.subplot(224)  # 激活第四个子图
plt.hist(z1)  # 绘制z1的直方图
plt.show()  # 显示图形

# 输出x1和z1的统计描述
print(sts.describe(x1))
print(sts.describe(z1))

# 注释掉的代码行用于保存图形到文件，但在这个示例中未执行
# fig.savefig('./img/2.4.1-3-Min-max normalization.png',dpi=600)